ako ziskat hwnd okna z hooku ?
Otázka od: Robert Suska
26. 11. 2003 14:46
Ahojte
Lamem to uz tri hodiny a uz nemam silu....
Mam nadefinovanu metodu
function TheHookProcCbt(Code : Integer; wParam : Cardinal; lParam :
Cardinal): longint; stdcall;
begin
result := 0;
if Code = HCBT_SYSCOMMAND then
begin
if wParam = SC_MINIMIZE then
begin
Application.Minimize;
// sem chcem ten kod
end;
if wParam = SC_RESTORE then
begin
Application.Restore;
end;
end;
if (Code < 0) then
result := CallNextHookEx(HookHandleCbt, Code, wParam, lParam);
end;
a hook inicializujem takto
HookHandleCbt := SetWindowsHookEx(WH_CBT, @TheHookProcCbt, hInstance,
GetCurrentThreadId);
jedna sa mi o to ze mam SDI aplikaciu ktora ma jedno okno stale otvorene a z
neho sa otvaraju dalsie ale modalne okna. A ja chcem aby sa mi pri
minimalizacii hocijakeho modalneho formu minimalizovala cela aplikacia. Toto
uz funguje tym co som sem pastol ale ten najvrchnejsi modalny form sa mi
hodi nad Start tlacitko (ako ked v delphi minimalizujete v design time
nejaky form alebo source code) windows menu a preto potrebujem zistit
handle toho okna z ktoreho bol vyslany povel na minimalizaciu (vlastne
handle najvrchnejsieho formu) aby som mohol povedat tomu oknu aby sa
schovalo... dufam ze by to slo cez ShowWindowAsync() ?? Handle som sa
pokusil dostat cez hwnd := tagMSG(Ptr(lParam)^).hwnd; ale toto sa da pouzit
iba s hookom WH_GETMESSAGE inac to hadze exception a potom som skusal este
cez msg := TMsg(Ptr(lParam)^); hwnd := msg.hwnd a toto tiez nejde
Dik za nakopnutie
Robo
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Bronislav Klucka
26. 11. 2003 14:50
API funkce hwnd:=GetForegroundWindow; (pokud ne ona, najdi si odkazy na
msdn, ktere jsou u teto fce)
Brona
> -----Original Message-----
> From: delphi-l-owner@clexpert.cz
> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of Robert Suska
> Sent: Wednesday, November 26, 2003 2:21 PM
> To: delphi-l@clexpert.cz
> Subject: ako ziskat hwnd okna z hooku ?
>
>
> Ahojte
>
> Lamem to uz tri hodiny a uz nemam silu....
>
> Mam nadefinovanu metodu
>
> function TheHookProcCbt(Code : Integer; wParam : Cardinal; lParam :
> Cardinal): longint; stdcall;
> begin
> result := 0;
> if Code = HCBT_SYSCOMMAND then
> begin
> if wParam = SC_MINIMIZE then
> begin
> Application.Minimize;
> // sem chcem ten kod
> end;
> if wParam = SC_RESTORE then
> begin
> Application.Restore;
> end;
> end;
> if (Code < 0) then
> result := CallNextHookEx(HookHandleCbt, Code, wParam, lParam);
> end;
>
> a hook inicializujem takto
>
> HookHandleCbt := SetWindowsHookEx(WH_CBT, @TheHookProcCbt, hInstance,
> GetCurrentThreadId);
>
> jedna sa mi o to ze mam SDI aplikaciu ktora ma jedno okno stale
> otvorene a z
> neho sa otvaraju dalsie ale modalne okna. A ja chcem aby sa mi pri
> minimalizacii hocijakeho modalneho formu minimalizovala cela
> aplikacia. Toto
> uz funguje tym co som sem pastol ale ten najvrchnejsi modalny form sa mi
> hodi nad Start tlacitko (ako ked v delphi minimalizujete v design time
> nejaky form alebo source code) windows menu a preto potrebujem zistit
> handle toho okna z ktoreho bol vyslany povel na minimalizaciu (vlastne
> handle najvrchnejsieho formu) aby som mohol povedat tomu oknu aby sa
> schovalo... dufam ze by to slo cez ShowWindowAsync() ?? Handle som sa
> pokusil dostat cez hwnd := tagMSG(Ptr(lParam)^).hwnd; ale toto sa
> da pouzit
> iba s hookom WH_GETMESSAGE inac to hadze exception a potom som skusal este
> cez msg := TMsg(Ptr(lParam)^); hwnd := msg.hwnd a toto tiez nejde
>
> Dik za nakopnutie
>
> Robo
>
>
>
>
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Petr Vones
26. 11. 2003 15:13
From: "Robert Suska" <suskar@seznam.cz>
> jedna sa mi o to ze mam SDI aplikaciu ktora ma jedno okno stale otvorene a z
> neho sa otvaraju dalsie ale modalne okna. A ja chcem aby sa mi pri
> minimalizacii hocijakeho modalneho formu minimalizovala cela aplikacia. Toto
Nejdes na to s hook funkci zbytecne slozite ? Co si napriklad tuto funkci
doplnit do predka tech modalnich dialogu (odchycenim WM_SYSMCOMMAND zpravy a
prislusnym zpracovanim).
Petr Vones
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Robert Suska
26. 11. 2003 15:23
Ahoj
Idem na to trochu zlozito ale za jednym ucelom, lebo sa mi nechce pisat do
kazdeho formu tento kod
Tform.....
private
procedure one(var XMEssage: TMessage); message WM_SYSCOMMAND;
end;
procedure TfrmNisHosp.one;
begin
if XMessage.WParam = SC_MINIMIZE then
begin
Application.Minimize;
ShowWindowAsync(self.handle, SW_HIDE);
end;
inherited
end;
takze mi to vsetko urobi ten hook cize zo vsetkych formov mi to bude
odchytavat minimize a restore a bude to robit co chcem
inac uz to skoro mam nieco ma este napadlo, takze to sem pastnem ked to bude
odladene mozno sa to niekomu zide
Robo
> Nejdes na to s hook funkci zbytecne slozite ? Co si napriklad tuto funkci
> doplnit do predka tech modalnich dialogu (odchycenim WM_SYSMCOMMAND zpravy
a
> prislusnym zpracovanim).
>
> Petr Vones
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Petr Vones
26. 11. 2003 15:20
From: "Robert Suska" <suskar@seznam.cz>
> Idem na to trochu zlozito ale za jednym ucelom, lebo sa mi nechce pisat do
> kazdeho formu tento kod
Proto jsem psal, at si vytvoris takovy formular jako predka a od neho pak
odvozujes svoje dialogy.
Pouziti hooku ma negativni vliv na rychlost zpracovani zprav.
Petr Vones
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Robert Suska
26. 11. 2003 18:31
Ahojte
takze takto som to urobil
function TheHookProcCbt(Code : Integer; wParam : Cardinal; lParam :
Cardinal): longint; stdcall;
begin
result := 0;
case Code of
HCBT_SYSCOMMAND:
case wParam of
SC_MINIMIZE:
begin
if GetForegroundWindow <>
Application.Handle then
ShowWindowAsync(GetForegroundWindow,
SW_HIDE)
else
ShowWindowAsync(frmMain.Handle,
SW_HIDE);
SendMessage(Application.Handle,
WM_SYSCOMMAND, SC_MINIMIZE, 0);
end;
SC_RESTORE:
begin
SendMessage(Application.Handle,
WM_SYSCOMMAND, SC_RESTORE, 0);
if GetForegroundWindow <>
Application.Handle then
ShowWindowAsync(frmNisHosp.Handle,
SW_SHOW);
end;
end;
end;
if (Code < 0) then
result := CallNextHookEx(HookHandleCbt, Code, wParam, lParam);
end;
toto funguje na w2000/XP ale na w98 to hodi Stack overflow. Neviete mi
povedat preco napr. p. Peter Vones? To riesenie co si mi navrhol s dedenim
formu a dopisanim kodu som skusal len mi to nejako nefunguje tak ako chcem
toto je super len to musim rozbehat na w98 a pohoda. Chyba vznikla na adrese
015f:004492ed.
Robo
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Petr Vones
26. 11. 2003 19:07
From: "Robert Suska" <suskar@seznam.cz>
> toto funguje na w2000/XP ale na w98 to hodi Stack overflow. Neviete mi
> povedat preco napr. p. Peter Vones? To riesenie co si mi navrhol s dedenim
Za prve nevim proc pouzivas zrovna CBT hook, pro filtrovani zprav jsou jine.
> formu a dopisanim kodu som skusal len mi to nejako nefunguje tak ako chcem
Pak je treba najit proc. Neni duvod proc by to nemelo fungovat.
> toto je super len to musim rozbehat na w98 a pohoda. Chyba vznikla na adrese
Tenhle kod ma jednu vadu, ovlivnuje chod vseho v aplikaci. Takze nejsi schopen
jej nikdy odladit, protoze jakakoli zmena v aplikaci muze navodit situaci, ze
se tam objevi opet nova chyba kterou si predtim nepodchytil. Zkratka se to k
tomu nehodi. Je to trochu jak s kanonem na vrabce.
> 015f:004492ed.
Podle formatu adresy to bude nekde v 16ti bitove casti kernelu. Windows 9x z
casti stale pouzivaji 16bitovy kod pro nektere operace, napriklad prace s
ikonami apod.
Moje rada je to takto zkratka neresit.
Petr Vones
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Petr Vones
26. 11. 2003 20:43
From: "Robert Suska" <suskar@seznam.cz>
> toto funguje na w2000/XP ale na w98 to hodi Stack overflow. Neviete mi
> povedat preco napr. p. Peter Vones? To riesenie co si mi navrhol s dedenim
> formu a dopisanim kodu som skusal len mi to nejako nefunguje tak ako chcem
Pokud jsem to dobre pochopil tak chces neco takoveho:
{ TAbstractDialog }
procedure TAbstractDialog.WMSysCommand(var Message: TWMSysCommand);
begin
case Message.CmdType and $FFF0 of
SC_MINIMIZE:
Application.Minimize;
else
inherited;
end;
end;
Petr Vones
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Petr Vones
26. 11. 2003 20:21
From: "Robert Suska" <suskar@seznam.cz>
> toto funguje na w2000/XP ale na w98 to hodi Stack overflow. Neviete mi
> povedat preco napr. p. Peter Vones? To riesenie co si mi navrhol s dedenim
> formu a dopisanim kodu som skusal len mi to nejako nefunguje tak ako chcem
Pokud jsem to dobre pochopil tak chces neco takoveho:
procedure TAbstractDialog.WMSysCommand(var Message: TWMSysCommand);
begin
case Message.CmdType and $FFF0 of
SC_MINIMIZE:
begin
Application.Minimize;
Message.Result := 0;
end;
else
inherited;
end;
end;
Petr Vones
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)
Odpovedá: Robert Suska
27. 11. 2003 0:47
Ahoj
> Pokud jsem to dobre pochopil tak chces neco takoveho:
>procedure TAbstractDialog.WMSysCommand(var Message: TWMSysCommand); begin
> case Message.CmdType and $FFF0 of
> SC_MINIMIZE:
> Application.Minimize;
> else
> inherited;
> end;
>end;
>Petr Vones
Ake easy presne toto som chcel a ja idem s tankom na zajace
Dik moc, funguje to skvele
Robo
----------
* www.inMail.sk - Vasa emailova adresa na cely zivot ZDARMA
* Mail neobsahuje virusy. Zkontrolovane antivirusom NOD32 (www.eset.sk)
* www.SlovakNET.sk - profesionalny webhosting, domena .SK ZADARMO
* Zoner Media Explorer 5 - stiahnite si pomocnika pre digitalnu fotografiu
(zme.zoner.sk)